package com.superheroes.controller.open.excle;

import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * excle大数据量导出
 */
public class BigExcelWriterUtils {


    /**
     *  常规的导出
     * @param response
     * @param rows   集合
     * @param btName   标题
     * @param exportName  导出名字
     * @param headerMap  导出 字段名 和 属性  的解释  ， 插入的顺序就是 导出 列明排序的顺序
     * @throws IOException
     */
    public static void  exportExcel(HttpServletResponse response, List<Object> rows,  String btName,String exportName, LinkedHashMap<String,Object> headerMap) throws IOException {

        // 通过工具类创建writer，默认创建xls格式
        ExcelWriter writer= ExcelUtil.getBigWriter();

        for (Map.Entry<String, Object> entry : headerMap.entrySet()) {
            writer.addHeaderAlias(entry.getKey(),(String) entry.getValue() );
        }
        if(StringUtils.isNotBlank(btName))
        {
            writer.merge(headerMap.entrySet().size()-1, btName);
        }
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);
        //out为OutputStream，需要写出到的目标流
        ServletOutputStream out=response.getOutputStream();
        try {
            //response为HttpServletResponse对象
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
            response.setHeader("Content-Disposition","attachment;filename="+ new String(exportName.getBytes("gbk"), "ISO8859-1"));
            writer.flush(out, true);

        }catch (Exception e)
        {
            e.printStackTrace();
        }finally {
            // 关闭writer，释放内存
            writer.close();
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        }
    }


    /**
     *  自定义导出  自己设置  writer  的 长度 颜色 等
     * @param writer
     * @param response
     * @param rows
     * @param exportName
     * @throws IOException
     */
    public static void  exportExcel(ExcelWriter writer,HttpServletResponse response, List<Object> rows,String exportName) throws IOException {
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);
        //out为OutputStream，需要写出到的目标流
        ServletOutputStream out=response.getOutputStream();
        try {
            //response为HttpServletResponse对象
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
            response.setHeader("Content-Disposition","attachment;filename="+ new String(exportName.getBytes("gbk"), "ISO8859-1"));
            writer.flush(out, true);

        }catch (Exception e)
        {
            e.printStackTrace();
        }finally {
            // 关闭writer，释放内存
            writer.close();
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        }
    }

}
